/**
 * N个人排成一队。每个人都给出自己的映象。
 * 每个人的映象均会把自己排在第一个，后续则是真正排队的一个子序列。
 * 问所有人的映象是否存在矛盾
 * 每个人的映象，除了自己之外，建一条有向边，没有环就没有矛盾
 * 可以使用拓扑排序
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using vpii = vector<pii>;

int N;
int K;
vector<vi> Input;
vector<vi> G;
vi Deg;

bool proc(){
    if(1 == N or 2 == N) return true;

    G.assign(N + 1, {});
    Deg.assign(N + 1, 0);
    for(const auto & v : Input){
        for(int i=2;i<N;++i){
            G[v[i - 1]].emplace_back(v[i]);
            ++Deg[v[i]];
        }
    }

    queue<int> q;
    for(int i=1;i<=N;++i)if(0 == Deg[i])q.push(i);

    int ans = 0;
    while(not q.empty()){
        auto h = q.front(); q.pop(); ++ans;
        for(auto v : G[h]){
            if(--Deg[v] == 0){
                q.push(v);
            }
        }
    }
    
    return ans == N;
}

void work(){
    cin >> N >> K; 
    Input.assign(K, vi(N, 0));
    for(auto & v : Input){
        for(auto & i : v) cin >> i;
    }
    cout << (proc() ? "YES" : "NO") << "\n";
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int nofkase = 1;
	cin >> nofkase;
	while(nofkase--){	
        work();
	}
    return 0;
}